package chemtools_logica.LN.SFBean;

import chemtools_logica.BDL.IR.BDL_SFEventoxinsumoRemote;
import chemtools_logica.BDL.IR.BDL_SFIsumoRemote;
import chemtools_logica.BDL.IR.BDL_SFOrdenproduccionRemote;
import chemtools_logica.BDL.IR.BDL_SFTipoproductoxOrdenProduccionRemote;
import chemtools_logica.BDL.IR.BDL_SFTransformacionesRemote;

import chemtools_logica.Beans.AlmacenBean;
import chemtools_logica.Beans.ContenedoresBean;
import chemtools_logica.Beans.DetalleformulaBean;
import chemtools_logica.Beans.EventoxinsumoBean;
import chemtools_logica.Beans.FormulaBean;
import chemtools_logica.Beans.InsumoBean;
import chemtools_logica.Beans.LaboratorioBean;
import chemtools_logica.Beans.MedidaBean;
import chemtools_logica.Beans.OrdenproduccionBean;
import chemtools_logica.Beans.OrdenproduccionxTipoproduccionBean;
import chemtools_logica.Beans.ProduccionEstBean;
import chemtools_logica.Beans.ProductoBean;
import chemtools_logica.Beans.TipoinsumoBean;

import chemtools_logica.Beans.TipoproductoBean;
import chemtools_logica.Beans.TransformacionBean;
import chemtools_logica.Beans.UsuarioBean;

import chemtools_logica.Entidades.Almacen;
import chemtools_logica.Entidades.Detalleformula;
import chemtools_logica.Entidades.Evento;
import chemtools_logica.Entidades.Eventoxinsumo;
import chemtools_logica.Entidades.Formula;
import chemtools_logica.Entidades.Insumo;
import chemtools_logica.Entidades.Ordenproduccion;
import chemtools_logica.Entidades.Producto;
import chemtools_logica.Entidades.Tipoinsumo;

import chemtools_logica.Entidades.Tipoproducto;
import chemtools_logica.Entidades.Tipoproductoxordenproduccion;

import chemtools_logica.Entidades.Transformacion;

import chemtools_logica.Entidades.Usuario;

import chemtools_logica.Entidades.Vista.Graficoinsumoenprod;
import chemtools_logica.Entidades.Vista.Graficoinsumoenprodpormes;
import chemtools_logica.Entidades.Vista.Graficoordenescumppormes;
import chemtools_logica.Entidades.Vista.Graficoordenessegunlab;
import chemtools_logica.Entidades.Vista.Graficoprodenprodpormes;
import chemtools_logica.Entidades.Vista.Graficoproductosenprod;

import chemtools_logica.LN.IL.LN_SFTransformacionesLocal;
import chemtools_logica.LN.IR.LN_SFTransformacionesRemote;

import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import javax.ejb.EJB;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless(name = "LN_SFTransformaciones", mappedName = "map-LN_SFTransformaciones")
public class LN_SFTransformacionesBean implements LN_SFTransformacionesRemote, LN_SFTransformacionesLocal {
    @Resource
    SessionContext sessionContext;
    @PersistenceContext(unitName = "Chemtools_Logica")
    private EntityManager em;
    
    @EJB
    BDL_SFTransformacionesRemote bDL_SFTransformacionesRemote;
    
    @EJB
    BDL_SFTipoproductoxOrdenProduccionRemote bDL_SFTipoproductoxOrdenProduccionRemote;
    
    @EJB
    BDL_SFOrdenproduccionRemote bDL_SFOrdenproduccionRemote;
    
    @EJB
    BDL_SFEventoxinsumoRemote bDL_SFEventoxinsumoRemote;
    
    @EJB
    BDL_SFIsumoRemote bDL_SFInsumoRemote;
    

    public LN_SFTransformacionesBean() {
    }
    
    public List<OrdenproduccionBean> getOrdenProduccionFiltrado(OrdenproduccionBean filter){
        List<Ordenproduccion> listaOrdenesEnt = bDL_SFTransformacionesRemote.busquedaOrdenes(filter);
        List<OrdenproduccionBean> listOrdenes = new ArrayList<OrdenproduccionBean>();
        
        for(Ordenproduccion entidad : listaOrdenesEnt){
            OrdenproduccionBean bean = new OrdenproduccionBean();
            bean.setIdOrdenProduccion(entidad.getIdOrdenProduccion());
            bean.setComentario(entidad.getComentario());
            bean.setFechaRegistro(entidad.getFechaRegistro());
            UsuarioBean usu = new UsuarioBean();
            usu.setIdUsuario(entidad.getUsuario().getIdUsuario());
            usu.setNombre_Usuario(entidad.getUsuario().getNombre_Usuario());
            bean.setUsuario(usu);
            LaboratorioBean lab = new LaboratorioBean();
            lab.setIdLaboratorio(entidad.getLaboratorio().getIdLaboratorio());
            lab.setNombre(entidad.getLaboratorio().getNombre());
            bean.setLaboratorio(lab);
            bean.setEstado(entidad.getEstado());
            listOrdenes.add(bean);
        }
        return listOrdenes;
    }
    
    public List<OrdenproduccionxTipoproduccionBean> getProductosOrden(OrdenproduccionBean filter){
        List<Tipoproductoxordenproduccion> listaProdOrdenesEnt = bDL_SFTransformacionesRemote.busquedaProductosOrdenes(filter);
        List<OrdenproduccionxTipoproduccionBean> listProdOrdenes = new ArrayList<OrdenproduccionxTipoproduccionBean>();
        
        for(Tipoproductoxordenproduccion ordProd : listaProdOrdenesEnt){
            OrdenproduccionxTipoproduccionBean bean = new OrdenproduccionxTipoproduccionBean();
            TipoproductoBean prod = new TipoproductoBean();
            prod.setIdTipoProducto(ordProd.getTipoproducto().getIdTipoProducto());
            prod.setDescripcion(ordProd.getTipoproducto().getDescripcion());
            bean.setTipoproducto(prod);
            bean.setOrdenproduccion(filter);
            bean.setCantidad(ordProd.getCantidad());
            bean.setConformidad(ordProd.getConformidad());
            listProdOrdenes.add(bean);
        }
        return listProdOrdenes;
    }
    
    public List<FormulaBean> busquedaFormulasCompatibles(int id){
        List<Formula> listaFormEnt = bDL_SFTransformacionesRemote.busquedaFormulasCompatibles(id);
        List<FormulaBean> listaForm = new ArrayList<FormulaBean>();
        for(Formula entity: listaFormEnt){
            FormulaBean bean = new FormulaBean();
            bean.setIdFormula(entity.getIdFormula());
            bean.setDescripcion(entity.getDescripcion());
            bean.setFecha_Creacion(entity.getFecha_Creacion());
            bean.setNombre_Creador(entity.getNombre_Creador());
            bean.setApellido_Creador(entity.getApellido_Creador());
            bean.setEstado(entity.getEstado());
            listaForm.add(bean);
        }
        return listaForm;
    }
    
    public List<DetalleformulaBean> busquedaDetalle(int id){
        List<Detalleformula> listaFormEnt = bDL_SFTransformacionesRemote.busquedaDetalle(id);
        List<DetalleformulaBean> listaForm = new ArrayList<DetalleformulaBean>();
        for(Detalleformula entity: listaFormEnt){
            DetalleformulaBean bean = new DetalleformulaBean();
            TipoinsumoBean tipoIns = new TipoinsumoBean();
            tipoIns.setIdTipoInsumo(entity.getTipoinsumo().getIdTipoInsumo());
            tipoIns.setDescripcion(entity.getTipoinsumo().getDescripcion());
            MedidaBean med = new MedidaBean();
            med.setIdMedida(entity.getTipoinsumo().getMedida().getIdMedida());
            med.setDescripcion(entity.getTipoinsumo().getMedida().getDescripcion());
            tipoIns.setMedida(med);
            bean.setTipoinsumo(tipoIns);
            TipoproductoBean tipoPro = new TipoproductoBean();
            tipoPro.setIdTipoProducto(entity.getTipoproducto().getIdTipoProducto());
            tipoPro.setDescripcion(entity.getTipoproducto().getDescripcion());
            med.setIdMedida(entity.getTipoproducto().getMedida().getIdMedida());
            med.setDescripcion(entity.getTipoproducto().getMedida().getDescripcion());
            tipoPro.setMedida(med);
            bean.setTipoproducto(tipoPro);
            bean.setCantidad_Insumo(entity.getCantidad_Insumo());
            bean.setCantidad_Producto(entity.getCantidad_Producto());
            listaForm.add(bean);
        }
        return listaForm;
    }
    
    public List<DetalleformulaBean> busquedaItemTipoFromDetalle(int idFormula, int idProducto){
        List<Detalleformula> listaFormEnt = bDL_SFTransformacionesRemote.busquedaItemTipoFromDetalle(idFormula,idProducto);
        List<DetalleformulaBean> listaForm = new ArrayList<DetalleformulaBean>();
        for(Detalleformula entity: listaFormEnt){
            DetalleformulaBean bean = new DetalleformulaBean();
            TipoinsumoBean tipoIns = new TipoinsumoBean();
            tipoIns.setIdTipoInsumo(entity.getTipoinsumo().getIdTipoInsumo());
            tipoIns.setDescripcion(entity.getTipoinsumo().getDescripcion());
            MedidaBean med = new MedidaBean();
            med.setIdMedida(entity.getTipoinsumo().getMedida().getIdMedida());
            med.setDescripcion(entity.getTipoinsumo().getMedida().getDescripcion());
            tipoIns.setMedida(med);
            bean.setTipoinsumo(tipoIns);
            TipoproductoBean tipoPro = new TipoproductoBean();
            tipoPro.setIdTipoProducto(entity.getTipoproducto().getIdTipoProducto());
            tipoPro.setDescripcion(entity.getTipoproducto().getDescripcion());
            med.setIdMedida(entity.getTipoproducto().getMedida().getIdMedida());
            med.setDescripcion(entity.getTipoproducto().getMedida().getDescripcion());
            tipoPro.setMedida(med);
            bean.setTipoproducto(tipoPro);
            bean.setCantidad_Insumo(entity.getCantidad_Insumo());
            bean.setCantidadCumplida(0);
            bean.setCantidad_Producto(entity.getCantidad_Producto());
            listaForm.add(bean);
        }
        return listaForm;
    }
    
    public void transformar(String idInsumo,String idProducto, int idUsuario, int idFormula, int idOrden, String comentario){
        Transformacion trans = makeEntity(idInsumo, idProducto, idUsuario, idFormula, idOrden, comentario);
        //System.out.println("Lo que se manda: "+idInsumo+" - "+idProducto+" - "+idUsuario+" - "+idFormula+" - "+idOrden+" - "+comentario);
        //System.out.println("Insumo: "+trans.getInsumo().getIdInsumo()+"\n Producto: "+trans.getProducto().getIdProducto()+"\n usuario: "+trans.getUsuario().getIdUsuario()+"\n Orden: "+trans.getOrdenproduccion().getIdOrdenProduccion()+"Formula: "+trans.getFormula().getIdFormula());
        bDL_SFTransformacionesRemote.mergeTransformacion(trans);
    }
    
    public void cambiaEstadoOrden(OrdenproduccionBean orden){
        Ordenproduccion entity = bDL_SFOrdenproduccionRemote.getOrdenProcById(orden).get(0);
        entity.setEstado(orden.getEstado());
        bDL_SFOrdenproduccionRemote.mergeOrdenproduccion(entity);
    }
    
    public void updateConformidad(OrdenproduccionxTipoproduccionBean bean){
        Tipoproductoxordenproduccion entidad = new Tipoproductoxordenproduccion();
        entidad.setCantidad(bean.getCantidad());
        entidad.setConformidad(bean.getConformidad());
        Ordenproduccion orden = new Ordenproduccion();
        orden.setIdOrdenProduccion(bean.getOrdenproduccion().getIdOrdenProduccion());
        entidad.setOrdenproduccion(orden);
        Tipoproducto producto = new Tipoproducto();
        producto.setIdTipoProducto(bean.getTipoproducto().getIdTipoProducto());
        entidad.setTipoproducto(producto);
        bDL_SFTipoproductoxOrdenProduccionRemote.mergeTipoproductoxordenproduccion(entidad);
    }
    
    public List<TransformacionBean> traeProductos(String nombre, Date fechaMin, Date fechaMax){
        List<TransformacionBean> lista = new ArrayList<TransformacionBean>();
        List<Transformacion> listaEntity = bDL_SFTransformacionesRemote.buscaTransformacion(nombre, fechaMin, fechaMax);
        for(Transformacion entity : listaEntity){
            TransformacionBean bean = makeBean(entity);
            lista.add(bean);
        }
        return lista;
    }
    
    public List<EventoxinsumoBean> traeInsumosDeProductos(String idProducto){
        List<EventoxinsumoBean> lista = new ArrayList<EventoxinsumoBean>();
        List<Eventoxinsumo> listaEntity = bDL_SFTransformacionesRemote.buscaInsumosProd(idProducto);
        for(Eventoxinsumo entity : listaEntity){
            EventoxinsumoBean bean = makeBeanEventoxinsumo(entity);
            lista.add(bean);
        }
        return lista;
    }
    
    private EventoxinsumoBean makeBeanEventoxinsumo(Eventoxinsumo entity){
        EventoxinsumoBean bean = new EventoxinsumoBean();
        InsumoBean insbean = new InsumoBean();
        TipoinsumoBean tinsbean = new TipoinsumoBean();
        tinsbean.setDescripcion(entity.getInsumo().getTipoinsumo().getDescripcion());
        insbean.setTipoinsumo1(tinsbean);
        insbean.setIdInsumo(entity.getInsumo().getIdInsumo());
        insbean.setCalidad(entity.getInsumo().getCalidad());
        bean.setInsumo(insbean);
        bean.setContenido(entity.getContenido());
        return bean;
    }
    
    public Transformacion makeEntity(String idInsumo,String idProducto, int idUsuario, int idFormula, int idOrden, String comentario){
        Date hoy = new Date();
        double coment = Double.parseDouble(comentario);
        Transformacion trans = new Transformacion();
        trans.setComentario((int)coment);
        trans.setFecha_Tansformacion(hoy);
        Usuario usuario = new Usuario();
        usuario.setIdUsuario(idUsuario);
        trans.setUsuario(usuario);
        Formula formula = new Formula();
        formula.setIdFormula(idFormula);
        trans.setFormula(formula);
        Producto producto = new Producto();
        producto.setIdProducto(idProducto);
        trans.setProducto(producto);
        Insumo insumo = new Insumo();
        insumo.setIdInsumo(idInsumo);
        trans.setInsumo(insumo);
        Ordenproduccion orden = new Ordenproduccion();
        orden.setIdOrdenProduccion(idOrden);
        trans.setOrdenproduccion(orden);
        return trans;
    }
    
    public List<ProduccionEstBean> getGrafico(int opcion, Date fechaMin, Date fechaMax){
        List<ProduccionEstBean> lista = new ArrayList<ProduccionEstBean>();
        switch(opcion){
            case 1: List<Graficoproductosenprod> listaEnt1 = bDL_SFTransformacionesRemote.callProcedureGraficoProductosEnProd(fechaMin, fechaMax);lista.addAll(llenarBeanGrafico1(listaEnt1));break;
            case 2: List<Graficoprodenprodpormes> listaEnt6 = bDL_SFTransformacionesRemote.callProcedureGraficoProdEnProdPorMes(fechaMin, fechaMax);lista.addAll(llenarBeanGrafico6(listaEnt6));break;
            case 3: List<Graficoinsumoenprod> listaEnt3 = bDL_SFTransformacionesRemote.callProcedureGraficoInsumoEnProd(fechaMin, fechaMax);lista.addAll(llenarBeanGrafico3(listaEnt3));break;
            case 4: List<Graficoinsumoenprodpormes> listaEnt4 = bDL_SFTransformacionesRemote.callProcedureGraficoInsumoEnProdPorMes(fechaMin, fechaMax);lista.addAll(llenarBeanGrafico4(listaEnt4));break;
            case 5: List<Graficoordenessegunlab> listaEnt2 = bDL_SFTransformacionesRemote.callProcedureGraficoOrdenesSegunLab(fechaMin, fechaMax);lista.addAll(llenarBeanGrafico2(listaEnt2));break;
            case 6: List<Graficoordenescumppormes> listaEnt5 = bDL_SFTransformacionesRemote.callProcedureGraficoOrdenesCumpPorMes(fechaMin, fechaMax);lista.addAll(llenarBeanGrafico5(listaEnt5));break;
        }
        return lista;
    }
    
    private List<ProduccionEstBean> llenarBeanGrafico1(List<Graficoproductosenprod> listaEnt){
        List<ProduccionEstBean> lista = new ArrayList<ProduccionEstBean>();
        for(Graficoproductosenprod entidad: listaEnt){
            ProduccionEstBean bean = new ProduccionEstBean(entidad.getProducto(),entidad.getCantidad_Completa(),"","");            
            lista.add(bean);
        }
        return lista;
    }
    
    private List<ProduccionEstBean> llenarBeanGrafico2(List<Graficoordenessegunlab> listaEnt){
        List<ProduccionEstBean> lista = new ArrayList<ProduccionEstBean>();
        for(Graficoordenessegunlab entidad: listaEnt){
            ProduccionEstBean bean = new ProduccionEstBean(entidad.getLaboratorio(),entidad.getConteo(),"","");            
            lista.add(bean);        
        }
        return lista;
    }
    
    private List<ProduccionEstBean> llenarBeanGrafico3(List<Graficoinsumoenprod> listaEnt){
        List<ProduccionEstBean> lista = new ArrayList<ProduccionEstBean>();
        for(Graficoinsumoenprod entidad: listaEnt){
            ProduccionEstBean bean = new ProduccionEstBean(entidad.getInsumo(),entidad.getCantidad_Usada(),"","");            
            lista.add(bean);         
        }
        return lista;
    }
    
    private List<ProduccionEstBean> llenarBeanGrafico4(List<Graficoinsumoenprodpormes> listaEnt){
        List<ProduccionEstBean> lista = new ArrayList<ProduccionEstBean>();
        for(Graficoinsumoenprodpormes entidad: listaEnt){
            ProduccionEstBean bean = new ProduccionEstBean(entidad.getInsumo(),entidad.getCantidad_Usada(),entidad.getMes(),entidad.getAnio()+"");            
            lista.add(bean);         
        }
        return lista;
    }
    
    public String updateInsumoTrans(InsumoBean ins, EventoxinsumoBean evt){
        
        //Insumo eIns = bDL_SFTransformacionesRemote.getInsumoParaTransformar(ins.getIdInsumo());
        //eIns.setContenido(ins.getContenido());
        //eIns.setEstado(ins.getEstado());
        bDL_SFTransformacionesRemote.updateCantidadInsumo(ins);
        //Eventoxinsumo eInsumo = makeEntityEventoXInsumo(evt, eIns);
        bDL_SFTransformacionesRemote.makeEvento(evt);
        return "";
    }
    
    public Eventoxinsumo makeEntityEventoXInsumo(EventoxinsumoBean eventoxinsumo,Insumo insumoEntidad){
        
        Eventoxinsumo eInsumo = new Eventoxinsumo();
        Evento evento = new Evento();
        Usuario user = new Usuario();
        Almacen almacen = new Almacen();
        
        
        eInsumo.setInsumo(insumoEntidad);
        
            evento.setIdEvento(eventoxinsumo.getIdEvento());
            eInsumo.setEvento(evento);
        
        eInsumo.setFecha_Evento(eventoxinsumo.getFecha_Evento());
            
            user.setIdUsuario(eventoxinsumo.getIdUsuario());
            eInsumo.setUsuario(user);
            eInsumo.setContenido(eventoxinsumo.getContenido());
            if(eventoxinsumo.getIdProducto()!= null){
                eInsumo.setIdProducto(eventoxinsumo.getIdProducto());
            }
            almacen.setIdAlmacen(eventoxinsumo.getIdAlmacen());
            eInsumo.setAlmacen(almacen);
            
        return eInsumo;
    }
    
    private List<ProduccionEstBean> llenarBeanGrafico5(List<Graficoordenescumppormes> listaEnt){
        List<ProduccionEstBean> lista = new ArrayList<ProduccionEstBean>();
        for(Graficoordenescumppormes entidad: listaEnt){
            String nombreEstado = "";
            if(entidad.getEstado() == 4){
                nombreEstado = "Concluida";
            }
            if(entidad.getEstado() == 3){
                nombreEstado = "Inconclusa";
            }
            ProduccionEstBean bean = new ProduccionEstBean(nombreEstado,entidad.getConteo(),entidad.getMes(),entidad.getAnio()+"");            
            lista.add(bean);            
        }
        return lista;
    }
    
    private List<ProduccionEstBean> llenarBeanGrafico6(List<Graficoprodenprodpormes> listaEnt){
        List<ProduccionEstBean> lista = new ArrayList<ProduccionEstBean>();
        for(Graficoprodenprodpormes entidad: listaEnt){
            ProduccionEstBean bean = new ProduccionEstBean(entidad.getProducto(),entidad.getCantidad_Mes(),entidad.getMes(),entidad.getAnio()+"");            
            lista.add(bean);        
        }
        return lista;
    }
    
    private TransformacionBean makeBean(Transformacion entity){
        TransformacionBean bean = new TransformacionBean();
        bean.setFecha_Tansformacion(entity.getFecha_Tansformacion());
        bean.setComentario(entity.getComentario());
        UsuarioBean usubean = new UsuarioBean();
        usubean.setNombre_Usuario(entity.getUsuario().getNombre_Usuario());
        usubean.setIdUsuario(entity.getUsuario().getIdUsuario());
        bean.setUsuario(usubean);
        if(entity.getProducto()!= null){
            ProductoBean prodbean = new ProductoBean();
            prodbean.setIdProducto(entity.getProducto().getIdProducto());
            prodbean.setCalidad(entity.getProducto().getCalidad());
            bean.setProducto(prodbean);
        }
        if(entity.getInsumo()!= null){
            InsumoBean insbean = new InsumoBean();
            insbean.setIdInsumo(entity.getInsumo().getIdInsumo());
            insbean.setCalidad(entity.getInsumo().getCalidad());
            TipoinsumoBean tinsbean = new TipoinsumoBean();
            tinsbean.setIdTipoInsumo(entity.getInsumo().getTipoinsumo().getIdTipoInsumo());
            tinsbean.setDescripcion(entity.getInsumo().getTipoinsumo().getDescripcion());
            bean.setInsumo(insbean);
        }
        return bean;
    }
    
}
